Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.01.2015, 00:08
Аватар для The_Fat_Man
Новичок на форуме
Отправить личное сообщение для The_Fat_Man Посмотреть профиль Найти все сообщения от The_Fat_Man
 
Регистрация: 26.01.2015
Сообщений: 5

Динамическая подгрузка AJAX
Всем доброго времени суток! Прошу отнестись к моей проблеме серьезно, потому что я на самом деле долго пытался и не смог решить свою проблему.
P.S. Огромное спасибо всем тем, кто уделил мне свое свободное время.

Проблемы ниже по тексту.

Начну со строения БД:

Имя: blog_test_ajax
Таблица: posts
Поля:
id - INT
img - VARCHAR
video - VARCHAR
title - VARCHAR
text - VARCHAR

Файл index.php

<?php
    include 'INC/database_access.php';
 
    // Получаем первые 10 статей, которые будут видны изначально.
    $res = mysqli_query($db, "SELECT * from `posts` ORDER BY `id` DESC LIMIT 10");
 
    // Формируем массив из 10 статей.
    $articles = array();
    // Пока эта функция извлекает из БД записи, мы формируем массив.
    while($row = mysqli_fetch_assoc($res))
    {
        $articles[] = $row;
    } 
?>
 
<!DOCTYPE html>
<html lang="ru" dir="ltr" id="html">
    <head>
        <meta charset="utf-8">
        <title>Ajax test</title>
    
        <link rel="stylesheet" href="css/style.css">
 
        <!--Подключаем скрипты для создания динамической прокрутки-->
        <script src="js/AJAX/jquery.js"></script>
        <script src="js/AJAX/scripts.js"></script>
 
        <script>
            document.createElement('header');
            document.createElement('nav');
            document.createElement('article');
            document.createElement('footer');
            document.createElement('aside');
        </script>
    </head>
    
    <body>
        <div id="content_container">
 
                <div style="width: 200px;" id="articles">
 
                    <!--На каждом проходе извлекаем данные в переменную article-->
                    <?php foreach ($articles as $article): ?>
                            <h2><?php echo $article['title']; ?></h2>
                            <img src=img/materials/<?php echo $article['img']; ?>>
                            <p><?php echo $article['text']; ?></p>
                    <?php endforeach; ?>
    
                </div>
                
                <button id="more">More</button>
 
        </div>
    </body> 
</html>


Когда первые 10 записей выводятся без использования ajax запроса, то все хорошо, т.е. видит поля img и video (пока прозапас).

Файл database_access.php

<?php
$db_host = "localhost";
$db_name = "blog_test_ajax";
$db_user = "root";
$db_pass = "";
 
//Подключаемся к базе
$db = mysqli_connect ($db_host, $db_user, "", $db_name) or die ("Невозможно подключиться к БД");
// Указываем кодировку, в которой будет получена информация из базы
mysqli_query ($db, 'set character_set_results = "utf8"');


Файл obrabotchik.php

<?php
include 'INC/database_access.php';
 
// C какой статьи будет осуществляться вывод
$startFrom = $_POST['startFrom'];
 
// Получаем 10 статей, начиная с последней отображенной
$res = mysqli_query($db, "SELECT * from `posts` ORDER BY `id` DESC LIMIT {$startFrom}, 10");
 
// Формируем массив со статьями
$articles = array();
while ($row = mysqli_fetch_assoc($res))
{
    $articles[] = $row;
}
 
// Превращаем массив статей в json-строку для передачи через Ajax-запрос
echo json_encode($articles);
?>


Файл scripts.js

И вот тут загвоздка. Непонятно почему, если я изменю поле title здесь и в таблице на header, то у меня отказывается что-либо вытаскивать из БД. Таже проблема и с полем с именем img, не хочет его видеть в новых 10 записях, которые были извлечены с помощью запроса.

$(document).ready(function(){
 
/* Переменная-флаг для отслеживания того, происходит ли в данный момент ajax-запрос. 
В самом начале даем ей значение false, т.е. запрос не в процессе выполнения */    
var inProgress = false;
/* С какой статьи надо делать выборку из базы при ajax-запросе */ 
var startFrom = 10;
 
    /* Используйте вариант $('#more').click(function() для того, чтобы дать пользователю возможность управлять процессом, кликая по кнопке "Дальше" под блоком статей (см. файл index.php) */
    $(window).scroll(function() {
        
        /* Если высота окна + высота прокрутки больше или равны высоте всего документа и ajax-запрос в настоящий момент не выполняется, то запускаем ajax-запрос */
        if($(window).scrollTop() + $(window).height() >= $(document).height() -200 && !inProgress) {
    
        $.ajax({            
            /* адрес файла-обработчика запроса */
            url: 'obrabotchik.php',
            /* метод отправки данных */
            method: 'POST',
            /* данные, которые мы передаем в файл-обработчик */
            data: {"startFrom" : startFrom},
            /* что нужно сделать до отправки запрса */
            beforeSend: function() {
            /* меняем значение флага на true, т.е. запрос сейчас в процессе выполнения */
            inProgress = true;}
            /* что нужно сделать по факту выполнения запроса */            
            }).done(function(data){
            
            /* Преобразуем результат, пришедший от обработчика - преобразуем json-строку обратно в массив */ 
            data = jQuery.parseJSON(data);
            
            /* Если массив не пуст (т.е. статьи там есть) */
            if (data.length > 0) {
                
            /* Делаем проход по каждому результату, оказвашемуся в массиве,
            где в index попадает индекс текущего элемента массива, а в data - сама статья */                 
            $.each(data, function(index, data){
            
            /* Отбираем по идентификатору блок со статьями и дозаполняем его новыми данными */    
            $("#articles").append(data.title + data.img + data.text);
            });
            
            /* По факту окончания запроса снова меняем значение флага на false */
            inProgress = false;
            // Увеличиваем на 10 порядковый номер статьи, с которой надо начинать выборку из базы
            startFrom += 10;
            }});   
        }
    });
});
Ответить с цитированием
  #2 (permalink)  
Старый 27.01.2015, 00:42
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,149

The_Fat_Man,
Сообщение от The_Fat_Man
data = jQuery.parseJSON(data);
а зачем это нужно ?

может у вас там уже массив?
Ответить с цитированием
  #3 (permalink)  
Старый 27.01.2015, 01:07
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

$.post('obrabotchik.php', {"startFrom" : startFrom}, function(response){
// здесь обрабатываем response ответ в json
}, 'json');

я бы так написал
Ответить с цитированием
  #4 (permalink)  
Старый 27.01.2015, 04:46
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от The_Fat_Man
не хочет его видеть
Кто не хочет? Сервер передает все правильно? Смотри в DevTools F12, вкладка Network (Сеть).
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 27.01.2015, 04:49
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от The_Fat_Man
method: 'POST'
Нет такого параметра. Есть type. И вобще, тебе Poznakomlus, показал как лучше сделать. В добавок, для приличия, можешь добавить перед echo такой код:
header('Content-Type: application/json');

Тогда и про 'json' не надо будет подсказывать для $.post.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 31.01.2015, 01:56
Аватар для The_Fat_Man
Новичок на форуме
Отправить личное сообщение для The_Fat_Man Посмотреть профиль Найти все сообщения от The_Fat_Man
 
Регистрация: 26.01.2015
Сообщений: 5

Прошу прошения за то, что так долго не реагировал на Ваш ответ. Я указал при создании темы, чтобы все оповещения приходили на почту, но новых сообщений не было даже в спаме. А теперь по теме. Я так понимаю, что Вы считаете, что было лишним парсить дату в json-строку?

data = jQuery.parseJSON(data);


К сожалению сейчас уже очень поздно, но я завтра с утра попробую сделать иначе и отпишусь. Спасибо за то, что приняли участие в обсуждении.
Ответить с цитированием
  #7 (permalink)  
Старый 31.01.2015, 02:01
Аватар для The_Fat_Man
Новичок на форуме
Отправить личное сообщение для The_Fat_Man Посмотреть профиль Найти все сообщения от The_Fat_Man
 
Регистрация: 26.01.2015
Сообщений: 5

Сообщение от Poznakomlus Посмотреть сообщение
$.post('obrabotchik.php', {"startFrom" : startFrom}, function(response){
// здесь обрабатываем response ответ в json
}, 'json');

я бы так написал
Буду признателен, если Вы объясните мне, чем этот способ лучше.

P.S. Я не понимаю одной вещи: почему если изменить имена полей в таблице БД на что-нибудь другое кроме title и text я не могу получить доступ к элементу массиву, т.е. говоря по-простому, если написать data.header вместо data.title, то ничего не выведется.
Ответить с цитированием
  #8 (permalink)  
Старый 31.01.2015, 02:09
Аватар для The_Fat_Man
Новичок на форуме
Отправить личное сообщение для The_Fat_Man Посмотреть профиль Найти все сообщения от The_Fat_Man
 
Регистрация: 26.01.2015
Сообщений: 5

Сообщение от danik.js Посмотреть сообщение
Кто не хочет? Сервер передает все правильно? Смотри в DevTools F12, вкладка Network (Сеть).
Передает-то да, я писал, что при выполнении вот этой части кода:

<?php
    include 'INC/database_access.php';
	  
	    // Получаем первые 10 статей, которые будут видны изначально.
    $res = mysqli_query($db, "SELECT * from `posts` ORDER BY `id` DESC LIMIT 10");
	  
	    // Формируем массив из 10 статей.
	    $articles = array();
	    // Пока эта функция извлекает из БД записи, мы формируем массив.
	    while($row = mysqli_fetch_assoc($res))
	    {
	        $articles[] = $row;
	    }
	?>


все очень даже хорошо, т.е. в поле таблицы у меня записано, например, photo/myphoto1.jpg и тогда все отлично.

<?php foreach ($articles as $article): ?>
	                            <h2><?php echo $article['title']; ?></h2>
	                            <img src=img/materials/<?php echo !!! СЮДА ВСЕ ЗАПИШЕТСЯ И ВЫВЕДЕТСЯ И БУДЕТ, ВООБЩЕМ, ВСЕ ОТЛИЧНО $article['img']; ?>>
<p><?php echo $article['text']; ?></p>
	                    <?php endforeach; ?>


а вот уже в следующих подгруженных десяти записях этого не будет. А почему?
Ответить с цитированием
  #9 (permalink)  
Старый 31.01.2015, 02:12
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от The_Fat_Man
data.header вместо data.title, то ничего не выведется.
Во всех местах надо менять, не только в БД. Везде в коде, где ипользуются поля. И в js в том числе.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #10 (permalink)  
Старый 31.01.2015, 02:13
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Поставь точки останова на 33 и 40 строках и смотри что не так.
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AJAX динамическая подгрузка страниц и скрипт для поисковой оптимизации сайта gumapumba AJAX и COMET 0 17.12.2013 12:46
ajax + динамическая подгрузка скриптов czp AJAX и COMET 3 26.03.2013 22:31
Динамическая подгрузка контента при прокрутке assd18 AJAX и COMET 11 14.03.2013 14:05
Динамическая подгрузка view через AJAX shkarbatov jQuery 0 13.02.2013 00:02
Какой фреймворк выбрать? нужно а) компоненты формы б) ajax подгрузка объектов ... plazzzm Библиотеки/Тулкиты/Фреймворки 5 05.02.2013 17:41